﻿<?php

// définit les 3 octets d'en-tête d'un fichier texte encodé en UTF-8
// define("CODE_UTF8", pack("ccc", 0xef, 0xbb, 0xbf));

class amap {
  var $adExiste;					// Indique si l'adhérent est en base
  var $adLoggue;					// Indique si l'utilisateur est loggué
  var $adherent;					// la fiche adhérent
	
  var $listePeriodesAdhesion;		// liste des périodes d'adhésions futur, courante et passée
  var $listeAdhesions;			// liste des adhésions de l'adhérent

  var $periodeAdhesionCourante;	// la période d'adhésion courante
  var $periodeAdhesionFutur;		// prochaine période d'adhésion	
	
  var $adhesion;					// l'adhésion pour la période courante
  var $adhesionFutur;				// l'adhérent a une adhésion la période futur (bool)
	
  var $aboSouscrit;				// Les abonnement souscrits
  var $aboPropose;				// les abonnements non souscrits

  var $adEstAbonne;				// indique si l'adhérent est abonné à l'abonnement sélectionné
  var $aboadherent;				// la souscription à l'abonnement sélectionné
	
  var $listeDistrib;				// liste des distributions d'un abonnement

  var $listeOrphDistrib;			// liste des paniers orphelins d'une distribution
  var $listOrphAdopte;			// liste des paniers orphelins ayant trouvé un adoptant
  var $listeAdoptantPanierAd;		// liste des adoptants pour le panier de l'adhérent
  var $listeOrphAdopteAd;			// liste des paniers orphelins adopté par l'adhérent
	
  var $listeEquipeDistrib;		// liste des inscrits pour l'équipe de distribution
	
  var $listeDatesReport;			// liste des dates à laquelle on peut report le panier de la distribution courante

  var $gestAnnee;					// l'année de référence pour la gestion des adhérents
  var $gestAdherentsV;			// la liste de tous les adherents Validé avec leurs adhésion pour la période 
  var $gestAdherentsI;			// la liste de tous les adherents  à valider avec leurs adhésion pour la période 
	
  var $gestAboEncours;			// la liste des abonnements souscrits avec le statut encours
  var $gestAboListe;				// la liste des abonnements souscrits avec le statut list
  var $gestAboAbandonne;			// la liste des abonnements souscrits avec le statut abandonnée
  var $gestAboInvalide;			// la liste des abonnements souscrits avec le statut invalide
	
  var $formulaire;
  var $tableau;

  function init() {
	
    global $mainframe;
	
    $database =& JFactory::getDBO();
    $my =& JFactory::getUser();
		
    if ($my->id == 0) { // Utilisateur pas authentifié
      echo 'Vous devez être authentifié pour accéder à ces pages';
      $this->adLoggue = FALSE;
    } else {
      // l'utilisateur est authentifié
      $this->adLoggue = TRUE;
			
      // si la gestion est effectué par l'adhérent effectivement loggué alors charger la fiche normalement
      if($mainframe->getUserState("amap_idag", 0) == 0 || JRequest::getVar('idag', 0) != 0)
	{
	  // recupère les informations d'un adhérent en fonction de son indentifiant Joomla
	  $query = "SELECT * FROM amap_adherent where IDJ = ".$my->id;
	  $database->setQuery($query);
	  $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();}
				
	  if ($database->getNumRows() == 0) { // on n'a pas trouvé d'abonnement rattaché, on cherche un qui correspond (email identiques)
	    $query = "SELECT * FROM amap_adherent where email = '".$my->email."'";
	    $database->setQuery($query);
	    $database->query(); if ($database->getErrorNum()){echo 'Erreur ' .$database->getErrorNum().': '.$database->getErrorMsg().'<Br />';} 
	    if ($database->getNumRows() == 0) { // on a pas trouvé 
	      $this->adExiste = FALSE;
	    } else {
	      $query = "UPDATE amap_adherent SET IDJ =".$my->id." WHERE email ='".$my->email."';";
	      $database->setQuery($query);
	      $database->query(); if ($database->getErrorNum()) { echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<Br />';} 
						
	      message("Un abonnement avec votre email a été trouvé, il vous a été attribué");
						
	      $this->adExiste = TRUE;
	      $mainframe->setUserState('amap_ida', $this->adherent['IDA']);
						
	      // recupère les informations d'un adhérent en fonction de son indentifiant Joomla
	      $query = "SELECT * FROM amap_adherent where IDJ = ".$my->id;
	      $database->setQuery($query);
	      $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();}
	    }

	  } else {
	    // l'adhérent existe en base
	    $this->adExiste = TRUE;				
	  }
				
	  if($this->adExiste){
	    // charge la fiche de l'adhérent
	    $this->adherent = $database->loadAssoc();

	    // ida en variable de session
	    $mainframe->setUserState('amap_ida', $this->adherent['IDA']);
					

					
	    // ********************************  déterminaton des droits
	    // Droit de gestion des adhésions (Param1)
	    $query = "SELECT * FROM amap_adherentpermission  where Param1 = 1 AND IDA = ".$this->adherent['IDA'];
	    $database->setQuery($query);
	    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();} 
	    if ($database->getNumRows() == 0) { 
	      $mainframe->setUserState("amap_droitAd", FALSE);
	    } else {
	      $mainframe->setUserState("amap_droitAd", TRUE);
	    }
	    // Droit de gestion des abonnements (Param2)
	    $query = "SELECT * FROM amap_adherentpermission  where Param2 = 1 AND IDA = ".$this->adherent['IDA'];
	    $database->setQuery($query);
	    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();} 
	    if ($database->getNumRows() == 0) { 
	      $mainframe->setUserState("amap_droitAbo", FALSE);
	    } else {
	      $mainframe->setUserState("amap_droitAbo", TRUE);
	    }
						
	    // ********************************  gestion par tiers
	    // si l'adhérent effectivement loggué a les droits de gestion des adhésions
	    if($mainframe->getUserState("amap_droitAd")){
	      // est-ce que l'identité de l'adhérent dont on effectue la gestion est différente de l'identité de l'adhérent effectivement loggué
	      if(JRequest::getVar('idag', 0) != 0 && JRequest::getVar('idag') != $this->adherent['IDA']){

		$idag = JRequest::getVar('idag');
		// cette requête permet à la fois de vérifier que l'ida passé en paramètre existe et de récupérer le nom et prénom de l'adhérent dont on veut effectuer la gestion
		$query = "SELECT concat(Nom, ' ', Prenom) FROM amap_adherent WHERE IDA = ".$idag;
		$database->setQuery($query);
		$database->query(); if ($database->getErrorNum()){echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();};
		// l'adhérent a été trouvé
		if($database->getNumRows() == 1){
		  $resultat = $database->loadRow();
		  // idag prend la valeur de l'ida de l'adhérent effectivement loggué et permet d'effectuer la gestion à sa place
		  $mainframe->setUserState("amap_idag", $idag);
		  $mainframe->setUserState("amap_nomg", $resultat[0]);
		}
		else
		  {
		    // si on a pas trouvé d'adhérent et que l'ida en paramètre vaut 0 alors cela veut dire qu'on quitte le mode gestion par tiers
		    if($idag == 0)
		      {
			$mainframe->setUserState("amap_idag", 0);
			$mainframe->setUserState("amap_idag", "");
		      }
		  }
	      }
	    }
	  }
	}
      else
	{
	  // la gestion est effectué par un tiers donc l'adhérent existe forcément
	  $this->adExiste = TRUE;
	}

      if ($this->adExiste){

	// En tete visibles sur toutes les pages
	echo '<div id="amap_header">';
	echo '<table width="100%">';
	echo '<tr><td><p>'.$my->username." : Bienvenu(e) sur le site de gestion de l'AMAP.";
	$pathway  =& $mainframe->getPathway();
	$pathway->addItem('Gestion AMAP', 'index.php?option=com_amap');
				
	// affichage des droits
	if($mainframe->getUserState("amap_droitAd") || $mainframe->getUserState("amap_droitAbo")){
	  echo " Vous avez la permission de gérer : ";
	  if($mainframe->getUserState("amap_droitAd")){
	    echo " les <strong>adhésions</strong>";
	  }
	  if($mainframe->getUserState("amap_droitAd") && $mainframe->getUserState("amap_droitAbo")){
	    echo " et ";
	  }
	  if($mainframe->getUserState("amap_droitAbo")){
	    echo " les <strong>abonnements</strong>";
	  }
	}

	// affichage de l'identité prise si c'est le cas
	if($mainframe->getUserState("amap_idag") != NULL){
	  echo ' Vous êtes sous l\'indentité de <strong>'.$mainframe->getUserState("amap_nomg", "").'</strong>.';

	  echo '</td>';
	  echo '<td align="right"><nobr><a class="amap_bouton" href="index.php?option=com_amap&amp;task=retroceder">Rétrocéder cette indentité</a></nobr></td>';
	} else {
	  echo '</td>';
	}

	echo '</tr></table>';
	echo '</div>';			
			
	// si l'adhérent est géré par un tiers alors charger la fiche de l'adhérent dont on effecture la gestion
	if($mainframe->getUserState("amap_idag", 0) > 0)
	  {
	    $query = "SELECT * FROM amap_adherent WHERE IDA = ".$mainframe->getUserState("amap_idag", 0);
	    $database->setQuery($query);
	    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();}
	    $this->adherent = $database->loadAssoc();
	    $mainframe->setUserState('amap_ida', $this->adherent['IDA']);
	  }
				
	// ********************************  chargement des différents statut d'adhésion pour les différentes périodes
	$query = "SELECT * FROM amap_periodeadhesion";
	$database->setQuery($query);
	$database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();}
	$this->listePeriodesAdhesion = $database->loadAssocList();
				
	// cherche  la période d'adhésion courante
	foreach($this->listePeriodesAdhesion as $periode) {
	  if($periode['Statut'] == 'courant')	{
	    $this->periodeAdhesionCourante = $periode['Periode'];
	  }
	}
				
	// cherche la période d'adhésion futur
	foreach($this->listePeriodesAdhesion as $periode) {
	  if($periode['Statut'] == 'futur'){
	    $this->periodeAdhesionFutur = $periode['Periode'];
	  }
	}
				
	// charge les adhésions effectués par l'adhérent
	$query = "SELECT * FROM amap_adhesion WHERE IDA = ".$this->adherent['IDA'];
	$database->setQuery($query);
	$database->query(); ; if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();}
	$this->listeAdhesions = $database->loadAssocList();

	// cherche une adhésion correspondante à la période d'adhésion courante
	foreach($this->listeAdhesions as $adhesion){
	  if($adhesion['Periode'] == $this->periodeAdhesionCourante) {
	    $this->adhesion = $adhesion;
	  }
	}
				
	// cherche une adhésion correspondante à la période d'adhésion futur
	foreach($this->listeAdhesions as $adhesion){
	  if($adhesion['Periode'] == $this->periodeAdhesionFutur) {
	    $this->adhesionFutur = $adhesion;
	  }
	}
				
	// ********************************  chargement des différents abonnement souscrit et ceux a souscrire
	$idtab = JRequest::getVar('idtab', '');
	$critere = JRequest::getVar('critere', '');
	$ordre = JRequest::getVar('ordre', '');
				
	// abonnements souscris
	$query = "	SELECT amap_abonnement.Nom, amap_abonnement.Societe, amap_abonnement.Produit, amap_abonnementadherent.Commentaire,	CASE amap_abonnementadherent.Statut 
																																				WHEN 'Encours' THEN 'En cours'
																																				WHEN 'Liste' THEN 'Liste d\'attente'
																																				WHEN 'Abonne' THEN 'Abonné'
																																				WHEN 'Invalide' THEN 'Invalide'
																																				END
							FROM amap_abonnement, amap_abonnementadherent
							WHERE amap_abonnement.Nom = amap_abonnementadherent.NomAbonnement
							AND amap_abonnement.Statut != 'Clot'
							AND amap_abonnementadherent.IDA = ".$this->adherent['IDA'];
				
	// gestion du tri
	if($idtab == 'aboSouscrit'){
	  $query .= ' ORDER BY '.$critere.' '.$ordre;
	} else {
	  $query .= ' ORDER BY 1 ASC';
	}

	$database->setQuery($query);
	$database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
				
	if ($database->getNumRows() != 0) { 
	  $this->aboSouscrit = new tableau ;
	  $this->aboSouscrit->table = $database->loadAssocList('Nom'); 

	  $this->aboSouscrit->header[0] = 'Nom';
	  $this->aboSouscrit->header[1] = 'Société';
	  $this->aboSouscrit->header[2] = 'Produit';
	  $this->aboSouscrit->header[3] = 'Commentaire';
	  $this->aboSouscrit->header[4] = 'Statut';
					
	  // gestion du tri
	  $this->aboSouscrit->idtab = 'aboSouscrit';
	  $this->aboSouscrit->url = 'index.php?option=com_amap&amp;view=advoir';
					
	  if($idtab == 'aboSouscrit'){
	    $this->aboSouscrit->critereTri = $critere;
	    $this->aboSouscrit->ordreTri = $ordre;
	  } else {
	    $this->aboSouscrit->critereTri = 1;
	    $this->aboSouscrit->ordreTri = 'asc';
	  }
	}
				
	// abonnements proposés
	$query = "	SELECT Nom, societe, produit
							FROM amap_abonnement WHERE Nom NOT IN (SELECT NomAbonnement FROM amap_abonnementadherent WHERE IDA = ".$this->adherent['IDA'].")
							AND Statut != 'Clot' AND Statut != 'Complet' ";
				
	// gestion du tri
	if($idtab == 'aboDispo'){
	  $query .= ' ORDER BY '.$critere.' '.$ordre;
	} else {
	  $query .= ' ORDER BY 1 ASC';
	}
				
	$database->setQuery($query);
	$database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
				
	if ($database->getNumRows() != 0) { 
	  $this->aboPropose  = new tableau ;
	  $this->aboPropose->table = $database->loadAssocList('Nom'); 
	  $this->aboPropose->header[0] = 'Nom';
	  $this->aboPropose->header[1] = 'Société';
	  $this->aboPropose->header[2] = 'Produit';
					
					
	  // gestion du tri
	  $this->aboPropose->idtab = 'aboDispo';
	  $this->aboPropose->url = 'index.php?option=com_amap&amp;view=advoir';

	  if($idtab == 'aboDispo'){
	    $this->aboPropose->critereTri = $critere;
	    $this->aboPropose->ordreTri = $ordre;
	  } else {
	    $this->aboPropose->critereTri = 1;
	    $this->aboPropose->ordreTri = 'asc';
	  }
	}

	// lorsqu'un abonnement est passé en paramétre : Recherche des caractéristique de l'abonnement sélectionné ainsi que de la souscription de l'adhérent pour cet abonnement---------------
	$abo = JRequest::getVar('abo', '');
	if ($abo != '') {
	  $query = "SELECT * FROM amap_abonnement where nom = '".$abo."'";
	  $database->setQuery($query);
	  $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();} 
	  if ($database->getNumRows() == 0) { // on n'a pas trouvé d'abonnement 
	    echo "Abonnement inconnu";
	  } else {
	    $mainframe->setUserState("amap_abonnement", $database->loadAssoc());
	  }
					
	  $query = "SELECT * FROM amap_abonnementadherent where NomAbonnement = '".$abo."' AND IDA = ".$this->adherent['IDA'];
	  $database->setQuery($query);
	  $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg();} 
	  if ($database->getNumRows() == 0) { // on n'a pas trouvé d'abonnement 
	    $this->adEstAbonne = FALSE;
	  } else {
	    $this->aboadherent = $database->loadAssoc();
	    $this->adEstAbonne = TRUE;
	  }
	}

	// Si l'adhérent a le droit de gérer les adhésions alors charger la liste des périodes d'adhésions
	if ($mainframe->getUserState("amap_droitAd")) {
	  $query = "SELECT * FROM amap_periodeadhesion";
	  $database->setQuery($query);
	  $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
	  $this->gestAnAd = $database->loadObjectList();
	}
      }
    }
  }

  // charge la liste des distributions d'un abonnement
  function loadDistrib(){
    global $mainframe;

    // gestion du tri
    $idtab = JRequest::getVar('idtab', '');
    $critere = JRequest::getVar('critere', '');
    $ordre = JRequest::getVar('ordre', '');		
		
    $abonnement = $mainframe->getUserState("amap_abonnement");
		
    $database =& JFactory::getDBO();

    // début de la requête principale
    $query = "	SELECT amap_jourdistributionabonnement.Date,";

    $nbVariantes = count(listeVariantes());
    // sous-requêtes comptant le nombre de paniers pour chaque variante
    if($nbVariantes > 0){
      for($i = 0 ; $i < $nbVariantes ; $i++){
	// compte le nombre de paniers reportés à une autre date
	$reportsPourAutreDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
											FROM amap_abonnementadherent, amap_report
											WHERE amap_abonnementadherent.IDA = amap_report.IDA
											AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
											AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
											AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
											AND amap_report.DateInitial = amap_jourdistributionabonnement.Date
											AND amap_abonnementadherent.Statut = 'Abonne'";
				
	// compte le nombre de panier reportés à cette date
	$reportsPourCetteDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
											FROM amap_abonnementadherent, amap_report
											WHERE amap_abonnementadherent.IDA = amap_report.IDA
											AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
											AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
											AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
											AND amap_report.DateReport = amap_jourdistributionabonnement.Date
											AND amap_abonnementadherent.Statut = 'Abonne'";

	$subQuery[$i] = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0) - (".$reportsPourAutreDate.") + (".$reportsPourCetteDate.")
									FROM amap_abonnementadherent
									WHERE amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
									AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
									AND amap_abonnementadherent.Statut = 'Abonne'
									AND amap_jourdistributionabonnement.Date >= amap_abonnementadherent.premiereDistribution";
      }
      foreach($subQuery as $cle => $valeur){
	$query = $query.' ('.$valeur.') AS \''.$abonnement['Variante'.($cle+1)].'\',';
      }
    }
		
    /*
    // sous-reqûete comptant de le nombre de personne inscrites pour la distribution
    $subQuery = "	SELECT COUNT(*)
    FROM amap_distribution
    WHERE NomAbonnement = '".$abonnement['Nom']."'
    AND Statut = 'Inscrit'
    AND Date = amap_jourdistributionabonnement.Date";
    $query = $query.' ('.$subQuery.') AS \'Inscrits\', ';
    */
		
    // sous-reqûete comptant le nombre de paniers orphelins
    $subQuery = "	SELECT COUNT(*)
						FROM amap_orphelin
						WHERE amap_orphelin.Date = amap_jourdistributionabonnement.Date
						AND IDAadoptant = 0
						AND Statut = 1
						AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";
    $query = $query.' ('.$subQuery.') AS \'Orphelins\', ';
		
		
    // sous-requête retournant la liste des paniers orphelins de la distribution
    $subQueryListeOrph = "	SELECT amap_orphelin.IDA
								FROM amap_orphelin
								WHERE amap_orphelin.Date = amap_jourdistributionabonnement.Date
								AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";
		
    $subQueryAdoptant = "	SELECT CONCAT('Adopté par ', '<BR />', amap_adherent.Nom, '<BR />', amap_adherent.Prenom)
								FROM amap_adherent
								WHERE amap_adherent.IDA = amap_orphelin.IDAadoptant";
		
    // sous-requête retournant l'enregistrement du panier orphelin de l'adhérent
    $subQueryOrph = "	SELECT IF(amap_orphelin.IDAadoptant = 0, 'Orphelin', (".$subQueryAdoptant."))
							FROM amap_orphelin
							WHERE amap_orphelin.IDA = ".$this->adherent['IDA']."
							AND amap_orphelin.Statut = 1
							AND amap_orphelin.Date = amap_jourdistributionabonnement.Date
							AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";
						
    // sous-reqûete retournant le nombre de paniers reportés de l'adhérent pour la distribution (0 ou 1 en réalité)
    $subQueryReport = "	SELECT IF(COUNT(amap_report.DateReport) = 0, 'OK', CONCAT('Reporté au <br />',DATE_FORMAT(amap_report.DateReport, '%d/%m/%Y')))
							FROM amap_report
							WHERE amap_report.IDA = ".$this->adherent['IDA']."
							AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
							AND amap_report.DateInitial = amap_jourdistributionabonnement.Date";
	
    if($this->aboEstSouscrit()){
      // sous-requête retournant le statut du panier de l'adhérent
      $subQuery = "SELECT IF(".$this->adherent['IDA']." NOT IN (".$subQueryListeOrph."),(".$subQueryReport."),(".$subQueryOrph."))";
			
      $query = $query.' ('.$subQuery.') AS \'Panier\', ';
    }
		
    // sous-reqûete retournant le statut de l'adhérent relatif à la distribution
    $Chef = "	SELECT COUNT(*)
					FROM amap_distribution
					WHERE NomAbonnement = '".$abonnement['Nom']."'
					AND Date = amap_jourdistributionabonnement.Date
					AND Statut = 'Inscrit'
					AND Role = 0";
					
    $RoleAd = " SELECT Role
					FROM amap_distribution
					WHERE IDA = ".$this->adherent['IDA']."
					AND NomAbonnement = '".$abonnement['Nom']."'
					AND Date = amap_jourdistributionabonnement.Date
					AND Statut = 'Inscrit'";

    $subQueryInsc = "	SELECT COUNT(*) - (".$Chef.")
							FROM amap_distribution
							WHERE NomAbonnement = '".$abonnement['Nom']."'
							AND Statut = 'Inscrit'
							AND Date = amap_jourdistributionabonnement.Date";
					
    $subQuery = "SELECT IF((".$RoleAd.") = 0, 	CONCAT('1 Resp. (vous) + ', (".$subQueryInsc.")),
													CONCAT(IF((".$Chef.") = 1, '1 Resp. + ', ''), IF(ISNULL((".$RoleAd.")) = 0, CONCAT((".$subQueryInsc."), ' (dont vous)'), (".$subQueryInsc."))))";
					
    //$subQuery = "	SELECT CONCAT(IF((".$Chef.") = 0,'', IF((".$RoleAd.") = 0, '1 Chef ', '1 Chef + ')), IF((".$RoleAd.") = 0,' (vous) + ', ''), (".$subQueryInsc."), IF(ISNULL((".$RoleAd.")) = 0, IF((".$RoleAd.") != 0, ' (dont vous)' ,''), ''))";

    $query = $query.' ('.$subQuery.') AS \'Equipe\'';

    // clause FROM et WHERE de la requête principale
    $query = $query."	FROM amap_jourdistributionabonnement
							WHERE amap_jourdistributionabonnement.NomAbonnement = '".$abonnement['Nom']."'"
      // 2009/11/10 - Suppression de ce critère incompréhensible, empèche d'afficher les dates sur les période d'adhésion future ...
      //AND EXTRACT(YEAR FROM amap_jourdistributionabonnement.Date) != '".$this->periodeAdhesionFutur."'"
      ;

    // gestion du tri
    if($idtab == 'distributions'){
      $query .= ' ORDER BY '.$critere.' '.$ordre;
    } else {
      $query .= ' ORDER BY 1 ASC';
    }
							
    // récupère toutes les distributions de l'abonnement en cours de traitement avec le nombre de panier pour chaque variante
    // echo $query; // pour voir la requète si nécessité de debug 
    $database->setQuery($query);
    $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}

    if($database->getNumRows() > 0){
      $this->listeDistrib = new tableau;
      $this->listeDistrib->table = $database->loadAssocList();
      $this->listeDistrib->header[0] = 'Date';
      for($i = 1 ; $i < $nbVariantes+1 ; $i++){
	$this->listeDistrib->header[$i] = $abonnement['Variante'.$i];
      }
      $this->listeDistrib->header[$nbVariantes+1] = 'Orphelins';
      if($this->aboEstSouscrit()){
	$this->listeDistrib->header[$nbVariantes+2] = 'Votre panier';
	$this->listeDistrib->header[$nbVariantes+3] = 'Equipe';
      } else {
	$this->listeDistrib->header[$nbVariantes+4] = 'Equipe';
      }
			
      // gestion du tri
      $this->listeDistrib->idtab = 'distributions';
      $this->listeDistrib->url = 'index.php?option=com_amap&amp;view=advoirabo';
			
      if($idtab == 'distributions'){
	$this->listeDistrib->critereTri = $critere;
	$this->listeDistrib->ordreTri = $ordre;
      } else {
	$this->listeDistrib->critereTri = 1;
	$this->listeDistrib->ordreTri = 'asc';
      }
			
      // on met en valeur la ligne de la prochaine date de distribution
      foreach($this->listeDistrib->table as $row){
	if($row['Date'] >= date("Y-m-d")){
	  $this->listeDistrib->surlignage = $row['Date'];
	  break;
	}
      }
			
    } else {
      $this->listeDistrib == NULL;
    }
  }

  // ************************************ gestion des adhérents 
  function loadGestAd (&$nbValides, &$nbAValider) {
    $database =& JFactory::getDBO();

    // gestion du tri
    $idtab = JRequest::getVar('idtab', '');
    $critere = JRequest::getVar('critere', '');
    $ordre = JRequest::getVar('ordre', '');		
		
    $this->gestAnnee = JRequest::getVar('gestannee', '');

    // adhésions valides
    $query = "SELECT amap_adherent.IDA, concat( nom, ' ', prenom ) , email, concat( fixe, '/', mobile ), CommentaireBureau, commentaireadherent
				FROM amap_adherent, amap_adhesion where amap_adherent.IDA = amap_adhesion.IDA AND amap_adhesion.statut = 'V' AND Periode = '".$this->gestAnnee."'";
				
    // gestion du tri
    if($idtab == 'adValides'){
      $query .= ' ORDER BY '.$critere.' '.$ordre;
    } else {
      $query .= ' ORDER BY 2 ASC';
    }

    $database->setQuery($query);
    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
		
    $nbValides = $database->getNumRows();
		
    if ($nbValides != 0) { 
      $this->gestAdherentsV = new tableau ;
      $this->gestAdherentsV->table = $database->loadAssocList('IDA'); 
      $this->gestAdherentsV->header[0] = 'n°';
      $this->gestAdherentsV->header[1] = 'Nom prénom';
      $this->gestAdherentsV->header[2] = 'email';
      $this->gestAdherentsV->header[3] = 'fixe/mobile';
      $this->gestAdherentsV->header[4] = 'commentaire Bureau';
      $this->gestAdherentsV->header[5] = 'commentaire Adhérent';
			
      // gestion du tri
      $this->gestAdherentsV->idtab = 'adValides';
      $this->gestAdherentsV->url = 'index.php?option=com_amap&amp;view=gestad&amp;gestannee='.$this->gestAnnee;
			
      if($idtab == 'adValides'){
	$this->gestAdherentsV->critereTri = $critere;
	$this->gestAdherentsV->ordreTri = $ordre;
      } else {
	$this->gestAdherentsV->critereTri = 2;
	$this->gestAdherentsV->ordreTri = 'asc';
      }
    }
		
    // Adhésions à valider
		
    $query = "SELECT amap_adherent.IDA, concat( nom, ' ', prenom ) , email, concat( fixe, '/', mobile ), CommentaireBureau, commentaireadherent
				FROM amap_adherent, amap_adhesion where amap_adherent.IDA = amap_adhesion.IDA AND amap_adhesion.statut = 'A' AND Periode = '".$this->gestAnnee."'";

    // gestion du tri
    if($idtab == 'adAValider'){
      $query .= ' ORDER BY '.$critere.' '.$ordre;
    } else {
      $query .= ' ORDER BY 2 ASC';
    }

    $database->setQuery($query);
    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
		
    $nbAValider = $database->getNumRows();
		
    if ($nbAValider != 0) { 
      $this->gestAdherentsI = new tableau ;
      $this->gestAdherentsI->table = $database->loadAssocList('IDA'); 
      $this->gestAdherentsI->header[0] = 'n°';
      $this->gestAdherentsI->header[1] = 'Nom prénom';
      $this->gestAdherentsI->header[2] = 'email';
      $this->gestAdherentsI->header[3] = 'fixe/mobile';
      $this->gestAdherentsI->header[4] = 'commentaire Bureau';
      $this->gestAdherentsI->header[5] = 'commentaire Adhérent';

      // gestion du tri
      $this->gestAdherentsI->idtab = 'adAValider';
      $this->gestAdherentsI->url = 'index.php?option=com_amap&amp;view=gestad&amp;gestannee='.$this->gestAnnee;
			
      if($idtab == 'adAValider'){
	$this->gestAdherentsI->critereTri = $critere;
	$this->gestAdherentsI->ordreTri = $ordre;
      } else {
	$this->gestAdherentsI->critereTri = 2;
	$this->gestAdherentsI->ordreTri = 'asc';
      }		
		
    }
  }

  // ************************************ gestion des abonnements
  function loadGestAbo (&$nbEncours, &$nbListe, &$nbAbonne, &$nbInvalide) {

    //gestion du tri
    $idtab = JRequest::getVar('idtab', '');
    $critere = JRequest::getVar('critere', '');
    $ordre = JRequest::getVar('ordre', '');
	
    $database =& JFactory::getDBO();
		
    // liste des statuts d'un abonnement
    $statuts = array('Encours', 'Liste', 'Abonne', 'Invalide');
		
    $subQueryNbInsc = "	SELECT COUNT(*)
			FROM amap_distribution
			WHERE amap_distribution.IDA = amap_adherent.IDA
			AND amap_distribution.NomAbonnement = amap_abonnementadherent.NomAbonnement";
		
    // récupère les listes des abonnements des 4 statuts
    foreach($statuts as $statut){
      $query = 	"	SELECT amap_adherent.IDA, CONCAT(amap_adherent.Nom, ' ',amap_adherent.Prenom), amap_abonnementadherent.NomAbonnement, amap_abonnementadherent.DateAbonnement, amap_abonnementadherent.Commentaire, (".$subQueryNbInsc.")
							FROM amap_adherent, amap_abonnementadherent, amap_abonnement 
							WHERE amap_adherent.IDA = amap_abonnementadherent.IDA
							AND amap_abonnement.Nom = amap_abonnementadherent.NomAbonnement
							AND amap_abonnement.Statut<>'Clot'
							AND amap_abonnementadherent.Statut = '".$statut."'";

      // gestion du tri
      if($idtab == $statut){
	$query .= ' ORDER BY '.$critere.' '.$ordre;
      } else {
	$query .= ' ORDER BY 2 ASC';
      }
						  
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      if(${'nb'.$statut} = $database->getNumRows() > 0) {
	$this->{'gestAbo'.$statut} = new tableau ;
	$this->{'gestAbo'.$statut}->table = $database->loadAssocList();
	$this->{'gestAbo'.$statut}->header[0] = 'n°';
	$this->{'gestAbo'.$statut}->header[1] = 'Nom prénom';
	$this->{'gestAbo'.$statut}->header[2] = 'Abonnement';
	$this->{'gestAbo'.$statut}->header[3] = 'Date';
	$this->{'gestAbo'.$statut}->header[4] = 'Commentaire';
	$this->{'gestAbo'.$statut}->header[5] = 'Insc. équipe';
				
	// gestion du tri
	$this->{'gestAbo'.$statut}->idtab = $statut;
	$this->{'gestAbo'.$statut}->url = 'index.php?option=com_amap&amp;view=gestabo';
				
	if($idtab == $statut){
	  $this->{'gestAbo'.$statut}->critereTri = $critere;
	  $this->{'gestAbo'.$statut}->ordreTri = $ordre;
	} else {
	  $this->{'gestAbo'.$statut}->critereTri = 2;
	  $this->{'gestAbo'.$statut}->ordreTri = 'asc';
	}
      }
    }
  }

  // renvoie vrai si le panier de l'adhérent a été déclaré orphelin
  function estOrphelin($date){
    global $mainframe;
		
    $ida = $mainframe->getUserState("amap_ida", 0);
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);

    if($ida > 0 && $abonnement != NULL && $date != ''){
      $database = &JFactory::getDBO();
		
      $query = "SELECT * FROM amap_orphelin WHERE IDA = ".$ida." AND Date = '".$date."' AND NomAbonnement = '".$abonnement['Nom']."'";
			
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
		
      return $database->getNumRows() > 0;
    }
    return FALSE;
  }
	
  // charge la liste des paniers orphelin
  function loadListeOrph($date, $panierAdOrph){
    global $mainframe;

    // gestion du tri
    $idtab = JRequest::getVar('idtab', '');
    $critere = JRequest::getVar('critere', '');
    $ordre = JRequest::getVar('ordre', '');
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    $ida = $mainframe->getUserState("amap_ida", 0);
		
    $this->listeOrphDistrib = NULL;				// liste des paniers orphelins d'une distribution
    $this->listOrphAdopte = NULL;				// liste des paniers orphelins ayant trouvé un adoptant
    $this->listeAdoptantPanierAd = NULL;		// liste des adoptants pour le panier de l'adhérent
    $this->listeOrphAdopteAd = NULL;			// liste des paniers orphelins adopté par l'adhérent

    if($date != '' && $abonnement != NULL && $ida > 0){
      $database = &JFactory::GetDBO();
	
      // liste des paniers orphelins d'une distribution
      $subQueryNom = "SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
							FROM amap_adherent
							WHERE amap_adherent.IDA = amap_orphelin.IDA";

      $query = "	SELECT amap_orphelin.IDA, (".$subQueryNom."), amap_abonnementadherent.Variante
						FROM amap_orphelin, amap_abonnementadherent
						WHERE amap_orphelin.IDAadoptant = 0
						AND amap_orphelin.Statut = 1
						AND amap_abonnementadherent.IDA = amap_orphelin.IDA
						AND amap_orphelin.Date = '".$date."'
						AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'";
						
      // gestion du tri
      if($idtab == 'listeOrphDistrib'){
	$query .= ' ORDER BY '.$critere.' '.$ordre;
      } else {
	$query .= ' ORDER BY 2 ASC';
      }

      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
		
      if($database->getNumRows() > 0){
	$this->listeOrphDistrib = new tableau;
	$this->listeOrphDistrib->table = $database->loadAssocList();
	$this->listeOrphDistrib->header[0] = 'N° Adhérent';
	$this->listeOrphDistrib->header[1] = 'Propriétaire';
	$this->listeOrphDistrib->header[2] = 'Variante';
				
	// gestion du tri
	$this->listeOrphDistrib->idtab = 'listeOrphDistrib';
	$this->listeOrphDistrib->url = 'index.php?option=com_amap&amp;view=advoirdistrib&amp;abo='.$abonnement['Nom'].'&amp;distrib='.$date;
				
	if($idtab == 'listeOrphDistrib'){
	  $this->listeOrphDistrib->critereTri = $critere;
	  $this->listeOrphDistrib->ordreTri = $ordre;
	} else {
	  $this->listeOrphDistrib->critereTri = 2;
	  $this->listeOrphDistrib->ordreTri = 'asc';
	}
      }
			
      // liste des paniers orphelins ayant trouvé un adoptant
      $subQueryNom = "SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
							FROM amap_adherent
							WHERE amap_adherent.IDA = amap_orphelin.IDA";
							
      $subQueryAdoptant = "	SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
									FROM amap_adherent
									WHERE amap_adherent.IDA = amap_orphelin.IDAadoptant";

      $query = "	SELECT amap_orphelin.IDA, (".$subQueryNom."), (".$subQueryAdoptant.")
						FROM amap_orphelin
						WHERE amap_orphelin.IDAadoptant > 0
						AND amap_orphelin.Statut = 1
						AND amap_orphelin.Date = '".$date."'
						AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";
						
      // gestion du tri
      if($idtab == 'listOrphAdopte'){
	$query .= ' ORDER BY '.$critere.' '.$ordre;
      } else {
	$query .= ' ORDER BY 2 ASC';
      }

      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
		
      if($database->getNumRows() > 0){
	$this->listOrphAdopte = new tableau;
	$this->listOrphAdopte->table = $database->loadAssocList();
	$this->listOrphAdopte->header[0] = 'N° Adhérent';
	$this->listOrphAdopte->header[1] = 'Propriétaire';
	$this->listOrphAdopte->header[2] = 'Adoptant';
				
	// gestion du tri
	$this->listOrphAdopte->idtab = 'listOrphAdopte';
	$this->listOrphAdopte->url = 'index.php?option=com_amap&amp;view=advoirdistrib&amp;abo='.$abonnement['Nom'].'&amp;distrib='.$date;
				
	if($idtab == 'listOrphAdopte'){
	  $this->listOrphAdopte->critereTri = $critere;
	  $this->listOrphAdopte->ordreTri = $ordre;
	} else {
	  $this->listOrphAdopte->critereTri = 2;
	  $this->listOrphAdopte->ordreTri = 'asc';
	}
      }
			
      if($panierAdOrph){
	// liste des adoptants pour le panier de l'adhérent							
	$subQueryAdoptant = "	SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
										FROM amap_adherent
										WHERE amap_adherent.IDA = amap_orphelin.IDAadoptant";

	$query = "	SELECT (".$subQueryAdoptant."), amap_orphelin.DateAdoption, IF(amap_orphelin.Statut = 0, 'A renoncé', 'Adoptant acutel')
							FROM amap_orphelin
							WHERE amap_orphelin.IDA = ".$ida."
							AND amap_orphelin.Date = '".$date."'
							AND amap_orphelin.IDAadoptant > 0
							AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";

	// gestion du tri
	if($idtab == 'listeAdoptantPanierAd'){
	  $query .= ' ORDER BY '.$critere.' '.$ordre;
	} else {
	  $query .= ' ORDER BY 2 ASC';
	}
				
	$database->setQuery($query);
	$database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
	if($database->getNumRows() > 0){
	  $this->listeAdoptantPanierAd = new tableau;
	  $this->listeAdoptantPanierAd->table = $database->loadAssocList();
	  $this->listeAdoptantPanierAd->header[0] = 'Adoptant';
	  $this->listeAdoptantPanierAd->header[1] = 'Date d\'adoption';
	  $this->listeAdoptantPanierAd->header[2] = 'Statut';
				
	  // gestion du tri
	  $this->listeAdoptantPanierAd->idtab = 'listeAdoptantPanierAd';
	  $this->listeAdoptantPanierAd->url = 'index.php?option=com_amap&amp;view=advoirdistrib&amp;abo='.$abonnement['Nom'].'&amp;distrib='.$date;
					
	  if($idtab == 'listeAdoptantPanierAd'){
	    $this->listeAdoptantPanierAd->critereTri = $critere;
	    $this->listeAdoptantPanierAd->ordreTri = $ordre;
	  } else {
	    $this->listeAdoptantPanierAd->critereTri = 2;
	    $this->listeAdoptantPanierAd->ordreTri = 'asc';
	  }
	}
      }
			
      if(!$panierAdOrph){
	// liste des paniers adopté par l'adhérent
	$subQueryNom = "SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
								FROM amap_adherent
								WHERE amap_adherent.IDA = amap_orphelin.IDA";

	$query = "	SELECT amap_orphelin.IDA, (".$subQueryNom."), amap_abonnementadherent.Variante
							FROM amap_orphelin, amap_abonnementadherent
							WHERE amap_orphelin.IDAadoptant = ".$ida."
							AND amap_orphelin.Statut = 1
							AND amap_abonnementadherent.IDA = amap_orphelin.IDA
							AND amap_orphelin.Date = '".$date."'
							AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
							AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'";
							
	// gestion du tri
	if($idtab == 'listeOrphAdopteAd'){
	  $query .= ' ORDER BY '.$critere.' '.$ordre;
	} else {
	  $query .= ' ORDER BY 2 ASC';
	}
				
	$database->setQuery($query);
	$database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
	if($database->getNumRows() > 0){
	  $this->listeOrphAdopteAd = new tableau;
	  $this->listeOrphAdopteAd->table = $database->loadAssocList();
	  $this->listeOrphAdopteAd->header[0] = 'N° Adhérent';
	  $this->listeOrphAdopteAd->header[1] = 'Propriétaire';
	  $this->listeOrphAdopteAd->header[2] = 'Variante';
					
	  // gestion du tri
	  $this->listeOrphAdopteAd->idtab = 'listeOrphAdopteAd';
	  $this->listeOrphAdopteAd->url = 'index.php?option=com_amap&amp;view=advoirdistrib&amp;abo='.$abonnement['Nom'].'&amp;distrib='.$date;
					
	  if($idtab == 'listeOrphAdopteAd'){
	    $this->listeOrphAdopteAd->critereTri = $critere;
	    $this->listeOrphAdopteAd->ordreTri = $ordre;
	  } else {
	    $this->listeOrphAdopteAd->critereTri = 2;
	    $this->listeOrphAdopteAd->ordreTri = 'asc';
	  }
	}
      }
    }
  }
	
  // charge la liste des adhérents inscrits à une distribution
  function loadEquipeDistrib($date){
    global $mainframe;
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    if($abonnement != NULL){
      $database = &JFactory::GetDBO();
			
      // gestion du tri
      $idtab = JRequest::getVar('idtab', '');
      $critere = JRequest::getVar('critere', '');
      $ordre = JRequest::getVar('ordre', '');
			
      // détermination du nom de l'adhérent
      $subqueryNom = "SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
							FROM amap_adherent
							WHERE amap_distribution.IDA = amap_adherent.IDA";
							
      $subqueryRole = "	SELECT MIN(amap_distribution.Role)
								FROM amap_distribution
								WHERE amap_distribution.Date = '".$date."'
								AND amap_distribution.NomAbonnement = '".$abonnement['Nom']."'
								AND amap_distribution.Statut != 'Abandonne'";

      // liste de l'équipe de distribution
      $query = "	SELECT amap_distribution.IDA, (".$subqueryNom."), CONCAT(Fixe,'/', Mobile), IF(amap_distribution.Statut = 'Inscrit', 
																									IF(amap_distribution.Role = 0, 'Responsable',
																									IF(amap_distribution.Role = (".$subqueryRole."), 'Responsable (provisoire)', '')), 'A abandonné')
							
						FROM amap_distribution, amap_adherent
						WHERE amap_distribution.Date = '".$date."'
						AND amap_adherent.IDA = amap_distribution.IDA
						AND amap_distribution.NomAbonnement = '".$abonnement['Nom']."'
						GROUP BY amap_distribution.Role ASC";

      // gestion du tri
      if($idtab == 'listeEquipeDistrib'){
	$query .= ' ORDER BY '.$critere.' '.$ordre;
      } else {
	$query .= ' ORDER BY 4 DESC';
      }
						
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
		
      if($database->getNumRows() > 0){
	$this->listeEquipeDistrib = new tableau;
	$this->listeEquipeDistrib->table = $database->loadAssocList();
	$this->listeEquipeDistrib->header[0] = 'N°';
	$this->listeEquipeDistrib->header[1] = 'Nom Prénom';
	$this->listeEquipeDistrib->header[2] = 'Tel Fixe/Mobile';
	$this->listeEquipeDistrib->header[3] = 'Statut';
				
	// gestion du tri
	$this->listeEquipeDistrib->idtab = 'listeEquipeDistrib';
	$this->listeEquipeDistrib->url = 'index.php?option=com_amap&amp;view=advoirdistrib&amp;abo='.$abonnement['Nom'].'&amp;distrib='.$date;
				
	if($idtab == 'listeEquipeDistrib'){
	  $this->listeEquipeDistrib->critereTri = $critere;
	  $this->listeEquipeDistrib->ordreTri = $ordre;
	} else {
	  $this->listeEquipeDistrib->critereTri = 4;
	  $this->listeEquipeDistrib->ordreTri = 'desc';
	}
      }
    }
		
  }
	
  // charge la liste des distributions auxquelles on peut reporter un panier et renvoie vraie si on peut reporter le panier de la distribution
  function listeDistributionsReport($date){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    $ida = $mainframe->getUserState("amap_ida", 0);
		
    if($abonnement != NULL && $ida > 0){
      $database = &JFactory::getDBO();
		
      // on commence a regarder si un report sortant est possible 
      $query = "	SELECT Date, ReportSortant
						FROM amap_jourdistributionabonnement
						WHERE amap_jourdistributionabonnement.Date = '".$date."'
						AND amap_jourdistributionabonnement.NomAbonnement = '".$abonnement['Nom']."'
						GROUP BY Date DESC
						LIMIT ".($abonnement['EcartMaxReport']+1);
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
      if($database->getNumRows() == 1){
	$resultat = $database->loadRowList();
	$sortant = $resultat[0][1];
      } else {
	echo 'Erreur : deux jours de distribution en base pour la meme date et le même abonnément';
      }
					
      if ($sortant) {
	// on recherche les dates antérieures. Les dates pour la distribution qui vérifient les conditions suivantes 
	//		report entrant possible
	//		n'a pas déjà fait l'objet d'un report du même adhérent et pour la même distrib
	//		est supérieure à la première date de distribution pour cet abonné et cet abonnement
	// 		est inférieure à la date en paramètre 
	//		à rajouter : "est supérieure à la date courante"
	// on prend ces dates en ordre decroissant et on ne conserve que les plus proches de la date
	$query = "	SELECT Date, ReportSortant
						FROM amap_jourdistributionabonnement, amap_abonnementadherent
						WHERE amap_jourdistributionabonnement.Date <= '".$date."'
						AND amap_abonnementadherent.IDA = ".$ida."
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_jourdistributionabonnement.Date >= amap_abonnementadherent.PremiereDistribution
						AND amap_jourdistributionabonnement.Date >= NOW()
						AND amap_jourdistributionabonnement.ReportEntrant = 1  
						AND amap_jourdistributionabonnement.NomAbonnement = '".$abonnement['Nom']."'
						AND DATE NOT IN(
							SELECT DateReport FROM amap_report 
							WHERE IDA = ".$ida." 
							AND NomAbonnement='".$abonnement['Nom']."'
							AND DateReport != '".$date."'
						)
						GROUP BY Date DESC
						LIMIT ".($abonnement['EcartMaxReport']+1);
						
	$database->setQuery($query);
	$database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
	$liste = $database->loadAssocList();
			
	$dateCourante = date("Y-m-d");
			
	// recopie les dates dans un tableau simple sauf si la date est passé (inutile si fait dans le select)
	foreach($liste as $cle => $valeur){
	  if($valeur['Date'] > $dateCourante){
	    $this->listeDatesReport[] = $valeur['Date'];
	  }
	}
	// on inverse le tableau pour présenter les date en ordre croissant
	if($this->listeDatesReport != NULL){
	  $this->listeDatesReport = array_reverse($this->listeDatesReport);
	}

	// on cherche ensuite les dates postérieures qui vérifient donc les critères : 
	//		date supérieure à la date en argument
	//		report entrant possible
	//		n'a pas déjà fait l'objet d'un report du même adhérent (ajouter "et pour la même distrib")
	//		rajouter "et est inférieure à la date de dernière distrib"
	$query = "	SELECT Date
								FROM amap_jourdistributionabonnement, amap_abonnementadherent
								WHERE amap_jourdistributionabonnement.Date > '".$date."'
								AND amap_abonnementadherent.IDA = ".$ida."
								AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
								AND amap_jourdistributionabonnement.Date <= amap_abonnementadherent.DerniereDistribution
								AND amap_jourdistributionabonnement.Date >= NOW()
								AND amap_jourdistributionabonnement.ReportEntrant = 1  
								AND amap_jourdistributionabonnement.NomAbonnement = '".$abonnement['Nom']."'
								AND DATE NOT IN(
									SELECT DateReport FROM amap_report 
									WHERE IDA = ".$ida." 
									AND NomAbonnement='".$abonnement['Nom']."'
									AND DateReport != '".$date."'
								)
								GROUP BY Date ASC
								LIMIT ".($abonnement['EcartMaxReport']+1);
							
	$database->setQuery($query);
	$database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
				
	$liste = $database->loadAssocList();
				
	// recopie les dates dans dans le tableau simple après les dates antérieures
	foreach($liste as $cle => $valeur){
	  $this->listeDatesReport[] = $valeur['Date'];
	}
	// la date était bien sortante
	return TRUE;
      } else { 
	// la date n'etait pas sortante
	return FALSE;
      }

    }
		
		
  }
	
  // renvoie le formulaire nécéssaire pour faire un report de panier
  function formulaireReport($date){
    $formulaire = new formulaire;
    //$formulaire->titre = 'Reporter au';
    $formulaire->submittext = 'Reporter';
    $formulaire->task = 'adReport';
    $formulaire->fields = array(
				'dateReport'=>array('libelle'=>'Reporter ce panier au','name'=>'dateReport','type'=>'select','size'=>1,'disabled'=>array($date),'value'=>'','options'=>$this->listeDatesReport,'errmsg'=>NULL),
				'dateInitial'=>array('libelle'=>'dateInitial','name'=>'dateInitial','type'=>'hidden','value'=>$date,'errmsg'=>NULL),
				);
			
    return $formulaire;
  }
	
  // renvoie le formulaire nécéssaire à la saisie d'un compte rendu de distribution
  function formulaireCompteRendu($date){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($abonnement != NULL && $date != ''){
      $database = &JFactory::getDBO();
			
      $query = "	SELECT CompteRendu
						FROM amap_jourdistributionabonnement
						WHERE NomAbonnement = '".$abonnement['Nom']."' 
						AND Date = '".$date."'";
			
      $database->setQuery($query);
      $database->query();  if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      if($database->getNumRows() > 0){
	$resultat = $database->loadRowList();
      } else {
	$resultat = NULL;
      }
		
      $formulaire = new formulaire;
      $formulaire->submittext = 'Envoyer';
      $formulaire->task = 'enregistrerCompteRendu';
      $formulaire->fields = array(
				  'fieldset1'=>array('type'=>'fieldset', 'legend'=>'Compte rendu', 'endfield'=>'texte'),
				  'date'=>array('type'=>'hidden', 'name'=>'date', 'value'=>$date),
				  'texte'=>array('libelle'=>'Votre texte', 'type'=>'textarea', 'name'=>'texte', 'cols'=>50, 'rows'=>6, 'value'=>$resultat[0][0])
				  );
    }
				
    return $formulaire;	
  }
	
  // renvoie la date de report si l'adhérent a reporté le panier de la distribution
  function estReporte($date){
    global $mainframe;
    $ida = $mainframe->getUserState("amap_ida", 0);
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($ida > 0 && $abonnement != NULL && $date != ''){
      $database = &JFactory::getDBO();
		
      $query = "	SELECT DateReport
						FROM amap_report
						WHERE IDA = ".$ida."
						AND NomAbonnement = '".$abonnement['Nom']."'
						AND DateInitial = '".$date."'";
						
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      if($database->getNumRows() > 0){
	$resultat = $database->loadAssocList();
	return $resultat[0]['DateReport'];
      }
    }
    return NULL;
  }
	
  // renvoie le statut d'un adhérent vis à vis d'une distribution particulière
  function adStatutDistrib($date){
    global $mainframe;
    $ida = $mainframe->getUserState("amap_ida", 0);
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($ida > 0 && $abonnement != NULL && $date != ''){
      $database = &JFactory::getDBO();
		
      $query = "	SELECT Statut, Role
						FROM amap_distribution
						WHERE IDA = ".$ida."
						AND NomAbonnement = '".$abonnement['Nom']."'
						AND Date = '".$date."'";
						
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}

      if($database->getNumRows() > 0){
	$resultat = $database->loadAssocList();
	if($resultat[0]['Statut'] == 'Inscrit'){
	  $statut = 'Inscrit';
					
	  if($resultat[0]['Role'] == 0){
	    $statut = 'Chef d\'équipe';
	  }

	} else {
	  $statut = 'Abandonne';
	}


      } else {
	$statut = NULL;
      }

      return $statut;
    }
  }

  // renvoie le formulaire d'abonnement
  function formulaireAbo(){
    global $mainframe;

    $abonnement = $mainframe->getUserState("amap_abonnement");
    $ida = $mainframe->getUserState("amap_ida");
    $nom = $abonnement['Nom'];
    $societe = $abonnement['Societe'];
    $produit = $abonnement['Produit'];
    $periodicite = $abonnement['Periodicite'];
    $lieu = $abonnement['Lieu'];
		
    $formulaire = new formulaire;
    $formulaire->titre = 'Abonnement '.$abonnement['Nom'];
    $formulaire->submittext = 'Je m\'abonne';
    $formulaire->task = 'AdAbo';
		
    $formulaire->texte = descriptionAbonnement().etatAbonnements();

    // on cree un formulaire en fonction des caractéristiques de l'abonnement
    $formulaire->fields = array(
				'IDA'=>array('libelle'=>'IDA','name'=>'IDA','type'=>'hidden','value'=>$ida, 'errmsg'=>NULL),
				'email'=>array('libelle'=>'email','name'=>'email','type'=>'hidden','value'=>$this->adherent['Email'],'errmsg'=>NULL),
				'nom'=>array('libelle'=>'nom','name'=>'nom','type'=>'hidden','valie'=>$this->adherent['Nom'],'errmsg'=>NULL),
				'prenom'=>array('libelle'=>'prenom','name'=>'prenom','type'=>'hidden','valie'=>$this->adherent['Prenom'],'errmsg'=>NULL),
				);
    // charge la liste des variantes
    $listeVariantes = listeVariantes();

    // création du premier fieldset si on peut paramétrer le produit
    if($abonnement['QteMax'] > 1 || $listeVariantes != NULL){
      if($listeVariantes != NULL){
	$endfield = 'variante';
      } else {
	$endfield = 'quantite';
      }
      $formulaire->fields += array(
				   'fieldset1'=>array('type'=>'fieldset', 'legend'=>'Le produit', 'endfield'=>$endfield)
				   );
    }
		
    // si une quantité maximum est indiqué alors on demande la quantité
    if($abonnement['QteMax'] > 1){
      $formulaire->fields += array(
				   'quantite'=>array('libelle'=>'Quantité (max '.$abonnement['QteMax'].')','name'=>'quantite','type'=>'text', 'size'=>20,'value'=>'', 'errmsg'=>NULL),
				   );
    } ;

    // si il existe des variantes alors proposer un menu déroulant pour sélectionner une variante
    if($listeVariantes != NULL){
      $formulaire->fields += array(
				   'variante'=>array('libelle'=>'Variante', 'name'=>'variante','type'=>'select','size'=>1,'options'=>$listeVariantes,'value'=>'','errmsg'=>NULL),
				   );
    }
    // options de l'abonnement
    $listeOptions = listeOptions(); // nom des options
    $qteMaxOptions = qteMaxOptions(); // quantité max des options

    if($listeOptions != NULL) {
      $formulaire->fields += array(
				   'fieldset2'=>array('type'=>'fieldset', 'legend'=>'Options possibles', 'endfield'=>'option'.count($listeOptions))
				   );
		
      $i = 0;
      foreach($listeOptions as $cle => $option){
	// si aucune quantité max n'est indiqué alors on utilises une checkbox sinon un input text
	if($qteMaxOptions[$i] == 0) {
	  $formulaire->fields += array('option'.($i+1)=>array('libelle'=>$option,'name'=>'option'.($i+1),'type'=>'checkbox','value'=>0,'errmsg'=>NULL),);
	} else {
	  $formulaire->fields += array(
				       // 'option'.($i+1).'chk'=>array('libelle'=>'Prendre l\'option '.$option,'name'=>'option'.($i+1).'chk','type'=>'checkbox','value'=>0,'errmsg'=>NULL),
				       'option'.($i+1)=>array('libelle'=>$option.' (max '.$abonnement['QteMaxOption'.($i+1)].')','name'=>'option'.($i+1),'type'=>'text','value'=>'','size'=>10,'errmsg'=>NULL),);
	}
	$i++;
      }
    }
		
    // droplist pour choisir la date de sa première distribution
    $distributionsDispos = $this->distributionsDispos();
		
    $formulaire->fields += array(
				 'fieldset3'=>array('type'=>'fieldset','legend'=>'Début effectif', 'endfield'=>'premiereDistrib'),
				 'premiereDistrib'=>array('libelle'=>'Liste des distributions','type'=>'select','name'=>'premiereDistrib','options'=>$distributionsDispos,'size'=>1,'value'=>''),
				 );

    return $formulaire;
  }

  // renvoie la liste des distributions restantes afin pour choisir le début effectif de l'abonnement
  function distributionsDispos(){
    global $mainframe;
    //		$distributionsDispos=0;
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($abonnement != NULL){
      $database = &JFactory::getDBO();
			
      $query = "	SELECT Date
						FROM amap_jourdistributionabonnement
						WHERE NomAbonnement = '".$abonnement['Nom']."'
						AND DATE_ADD(DATE_SUB(Date, INTERVAL ".$abonnement['JoursPreparation']." DAY),INTERVAL '".$abonnement['Delai']."' HOUR_SECOND) > NOW()";
						
			
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      $resultat = $database->loadRowList();

      if ($resultat) {
	foreach($resultat as $row){
	  $distributionsDispos[] = $row[0];
	}
      }
			
      return $distributionsDispos;
    }
  }

  // renvoie la liste de toutes les distributions pour choisir le début et la fin effectives de l'abonnement par le gestionnaire
  function distributions(){
    global $mainframe;
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($abonnement != NULL){
      $database = &JFactory::getDBO();
			
      $query = "	SELECT Date
						FROM amap_jourdistributionabonnement
						WHERE NomAbonnement = '".$abonnement['Nom']."';";
			
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      $resultat = $database->loadRowList();

      if ($resultat) {
	foreach($resultat as $row){
	  $distributionsDispos[] = $row[0];
	}
      }
			
      return $distributionsDispos;
    }
  }
	
  // renvoie le tableau du rapport de la liste de distribution
  function rapportListeDistribution($date){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);

    if($abonnement != NULL){
      $database = &JFactory::getDBO();
			
      $header = array('Nom Prénom', 'Tel. Fixe / Mobile');

      $subQueryAdopte = "	SELECT IFNULL(COUNT(*), 0)
								FROM amap_orphelin
								WHERE amap_orphelin.IDA = amap_abonnementadherent.IDA
								AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
								AND amap_orphelin.Date = '".$date."'
								AND amap_orphelin.IDAadoptant > 0
								AND Statut = 1";
			
      $subQueryAdoptant = "	SELECT CONCAT(a.Nom, ' ', a.Prenom, ' - ',amap_adherent.Nom)
										FROM amap_adherent as a , amap_orphelin
										WHERE amap_abonnementadherent.IDA = amap_orphelin.IDA
										AND a.IDA = amap_orphelin.IDAadoptant
										AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
										AND amap_orphelin.Statut = 1
										AND amap_orphelin.Date = '".$date."'";
			
      $subQueryTelAdoptant = "SELECT CONCAT(amap_adherent.Fixe, ' / ',amap_adherent.Mobile)
									FROM amap_adherent, amap_orphelin
									WHERE amap_abonnementadherent.IDA = amap_orphelin.IDA
									AND amap_orphelin.IDAadoptant = amap_adherent.IDA
									AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
									AND amap_orphelin.Statut = 1
									AND amap_orphelin.Date = '".$date."'";
		
      $subQueryTel = "SELECT IF((".$subQueryAdopte.") > 0, (".$subQueryTelAdoptant."), CONCAT(amap_adherent.Fixe, ' / ', amap_adherent.Mobile))";
			
      $subQueryNom = "SELECT IF((".$subQueryAdopte.") > 0, (".$subQueryAdoptant."), CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom))";
			
      $query = "SELECT (".$subQueryNom.") AS 'NomPrenom', (".$subQueryTel.")";
			
      if ($abonnement['QteMax'] > 0 ){ // QteMax ==0 indique qu'on ne traite que des options 
	if(listeVariantes() != NULL){
	  $header[] = 'Variante';
	  $query .= ", amap_abonnementadherent.Variante";
	}
				
	$header[] = 'Quantité';

	$subQueryReportEntrant = "	SELECT COUNT(*)
											FROM amap_report
											WHERE amap_report.IDA = amap_abonnementadherent.IDA
											AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
											AND amap_report.DateReport = '".$date."'";
								
	$query .= " , amap_abonnementadherent.Quantite + amap_abonnementadherent.Quantite * (".$subQueryReportEntrant.")";
      }
			
      $listeOptions = listeOptions();
      if($listeOptions != NULL){
	$i = 0;
	foreach($listeOptions as $row){
	  $header[] = $row;
	  $query .= ", IF(amap_abonnementadherent.QuantiteOption".($i+1)." = 0, 	'-', amap_abonnementadherent.QuantiteOption".($i+1).")";
																							
	  $i++;
	}
      }

      $subQueryReport = "	SELECT COUNT(*)
								FROM amap_report
								WHERE amap_report.IDA = amap_abonnementadherent.IDA
								AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
								AND amap_report.DateInitial = '".$date."'";
								
      $subQueryNomProprietaire = "SELECT CONCAT('Adoption du panier de ', amap_adherent.Nom, ' ', amap_adherent.Prenom)
										FROM amap_adherent
										WHERE amap_adherent.IDA = amap_abonnementadherent.IDA";
								
      $subQueryOrphelin = "	SELECT IF(amap_orphelin.IDAadoptant = 0, 'Orphelin', (".$subQueryNomProprietaire."))
									FROM amap_orphelin
									WHERE amap_orphelin.IDA = amap_abonnementadherent.IDA
									AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
									AND amap_orphelin.Date = '".$date."'
									AND Statut = 1";
			
      $subQueryStatut = "	SELECT IF((".$subQueryReport.") > 0, 'Reporté', (".$subQueryOrphelin."))";
			
      $header[] = 'Statut';
      $query .= " , (".$subQueryStatut.")";
			
      $query .= "	FROM amap_adherent, amap_abonnementadherent
						WHERE amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_abonnementadherent.Statut = 'Abonne'
						AND amap_abonnementadherent.PremiereDistribution <= '".$date."'
						AND amap_abonnementadherent.DerniereDistribution >= '".$date."'
						AND amap_adherent.IDA = amap_abonnementadherent.IDA
						GROUP BY NomPrenom ASC";
			
      //message($query);
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {message( 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />');}

      if($database->getNumRows() == 0){
	return NULL;
      }
      $resultat = $database->loadAssocList();
			
      $arr[] = $header;
      foreach($resultat as $row){
	$arr[] = $row;
      }

      return $arr;
    }
  }

  // renvoie le nombre de panier que doit venir chercher un adhérent
  function nbPaniers($date){
    global $mainframe;
		
    $ida = $mainframe->getUserState("amap_ida", 0);
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    $date = JRequest::getVar('distrib', '');
		
    if($abonnement != NULL && $date != '' && $ida > 0){
      $database = &JFactory::getDBO();
		
		
      $subQueryPaniersAdoptes = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
										FROM amap_abonnementadherent, amap_orphelin
										WHERE amap_orphelin.IDA = amap_abonnementadherent.IDA
										AND amap_orphelin.NomAbonnement = amap_abonnementadherent.NomAbonnement
										AND amap_orphelin.IDAadoptant = ".$ida."
										AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'
										AND amap_orphelin.Date = '".$date."'
										AND amap_orphelin.Statut = 1";
										
      $subQueryPaniersReportes = "SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
										FROM amap_abonnementadherent, amap_report
										WHERE amap_report.IDA = amap_abonnementadherent.IDA
										AND amap_report.NomAbonnement = amap_abonnementadherent.NomAbonnement
										AND amap_report.IDA = ".$ida."
										AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
										AND amap_report.DateReport = '".$date."'
										AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'";
										
      $subQueryQuantite = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
									FROM amap_abonnementadherent
									WHERE amap_abonnementadherent.IDA = ".$ida."
									AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
									AND amap_abonnementadherent.Statut = 'Abonne'
									AND '".$date."' >= PremiereDistribution";
		
      $query = "	SELECT (".$subQueryQuantite.") + (".$subQueryPaniersAdoptes.") + (".$subQueryPaniersReportes.")";
		
      $database->setQuery($query);
      $database->query();  if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      if($database->getNumRows() >0){
	$resultat = $database->loadRow();

	return $resultat[0];
      }
			
      return NULL;
    }
  }

  // renvoie VRAI si l'abonnement en cours de traitement a été souscrit par l'adhérent et est valide
  function aboEstSouscrit(){
    global $mainframe;
	
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    $ida = $mainframe->getUserState("amap_ida", 0);

    if($abonnement != NULL && $ida > 0){
      $database = &JFactory::getDBO();
		
      $query = "	SELECT *
						FROM amap_abonnementadherent
						WHERE IDA = ".$ida."
						AND NomAbonnement = '".$abonnement['Nom']."'
						AND Statut = 'Abonne'";

      $database->setQuery($query);
      $database->query();  if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
			
      if($database->getNumRows() > 0){
	return TRUE;
      }
    }
    return FALSE;
  }
	
  // renvoie VRAI si le panier de l'adhérent a été adopté
  function panierAdAdopte($date){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
    $ida = $mainframe->getUserState("amap_ida", 0);
		
    if($abonnement != NULL && $ida > 0){
      $database = &JFactory::getDBO();
		
      // requête vérifiant que le panier orphelin n'a pas été adopté
      $query = "	SELECT IDA
						FROM amap_orphelin
						WHERE IDA = ".$ida."
						AND IDAadoptant > 0
						AND Statut = 1
						AND NomAbonnement = '".$abonnement['Nom']."'
						AND Date = '".$date."'";
			
      $database->setQuery($query);
      $database->query();	if($database->getErrorNum()){echo 'Error '.$database->getErrorNum().': '.$database->getErrorMsg().'<Br />';}
			
      return ($database->getNumRows() != 0);
    }
		
    return FALSE;
  }
	
  // renvoie le commentaire d'un abonnement particulier
  function adComAbo($ida){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
	
    if($abonnement != NULL){
      $database = &JFactory::getDBO();
			
      $query = "SELECT Commentaire FROM amap_abonnementadherent WHERE IDA = ".$ida." AND NomAbonnement = '".$abonnement['Nom']."'";
      $database->setQuery($query);
      $database->query();
			
      $resultat = $database->loadAssocList();
			
      return $resultat[0]['Commentaire'];
    } else {
      return NULL;
    }
		
  }
	
  // renvoie le tableau de composition des distributions à venir
  function listeEquipes(){
    global $mainframe;
		
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    $tableau = NULL;
    if($abonnement != NULL){

      $database = &JFactory::getDBO();
		
      // on récupère toutes les dates de distributions à venir
      $query = "SELECT Date FROM amap_jourdistributionabonnement WHERE NomAbonnement = '".$abonnement['Nom']."' AND Date > NOW() ORDER BY Date ASC";
      $database->setQuery($query);
      $database->query();  if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}

      $datesDistrib = $database->loadAssocList();
			

      // on récupère tous les inscrits dans les distributions à venir
			
      // nom/prénom de l'adhérent
      $subQueryNom = "SELECT CONCAT(amap_adherent.Nom, ' ', amap_adherent.Prenom)
							FROM amap_adherent
							WHERE amap_adherent.IDA = amap_distribution.IDA";
			
      // contacts téléphoniques de l'adhérent
      $subQueryTel = "SELECT CONCAT(amap_adherent.Fixe, ' / ', amap_adherent.Mobile)
							FROM amap_adherent
							WHERE amap_adherent.IDA = amap_distribution.IDA";
			
      // valeur minimale du role
      $subQueryMin = "SELECT MIN(Role) FROM amap_distribution WHERE amap_distribution.NomAbonnement = '".$abonnement['Nom']."' AND amap_distribution.Date = DateA";
			
      $subQueryStatut = "SELECT IF(amap_distribution.Role = 0, 'Responsable', IF(amap_distribution.Role = (".$subQueryMin."), 'Responsable (provisoire)', ''))";

      $query = "	SELECT Date AS 'DateA', (".$subQueryNom.") AS 'Nom', (".$subQueryTel.") AS 'Tel', (".$subQueryStatut.") as 'Statut'
						FROM amap_distribution
						WHERE NomAbonnement = '".$abonnement['Nom']."'
						AND Date > NOW()
						AND Statut = 'Inscrit'";
		
      $database->setQuery($query);
      $database->query();  if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}

      $equipiers = $database->loadAssocList();

      $tableau[0][0] = 'Date';
			
      // header du tableau
      for($i = 1 ; $i <= $abonnement['NombreEquipiers'] ; $i++){
	$tableau[0][$i] = 'Equipier '.$i;
      }
			
      $i = 1; // compteur d'équipe
      // pour chaque distribution de l'abonnement
      foreach($datesDistrib as $row1){
	$tableau[$i][0] = $row1['Date'];
				
	$nb = 0; // compte le nombre d'équipier valides
				
	// pour chaque equipiers inscrit dans l'abonnement
	foreach($equipiers as $row2){
				
	  // on regarde si son inscription correspond à la distribution actuellement passé en revue
	  if($row2['DateA'] == $row1['Date']){
					
	    // c'est le cas donc on recopie les informations relatives à l'adhérent
	    $tableau[$i][$nb + 1] = $row2['Nom'];
						
	    $nb++; 
	  }
	}
	// blancs à la place des slots d'équipiers vides
	for($j = 0 ; $j < ($abonnement['NombreEquipiers'] - $nb) ; $j++){
	  $tableau[$i][$nb+1+$j] = '';
	}
				
	$i++;
      }
    }
    return $tableau;
  }
	
  // renvoie quelques statistiques concernant les inscriptions en équipe de distribution
  function statsInscEquipe($ida, &$nbInscAd, &$moyNbInsc){
    global $mainframe;
	
    $abonnement = $mainframe->getUserState("amap_abonnement", NULL);
		
    if($abonnement != NULL && $ida > 0){
      $database = &JFactory::getDBO();
			
      // nombre d'inscriptions effectués par l'adhérent
      $subQueryNbInscAd = "	SELECT COUNT(*)
									FROM amap_distribution
									WHERE IDA = ".$ida."
									AND NomAbonnement = '".$abonnement['Nom']."'
									AND Statut = 'Inscrit'";
			
      // nombre d'abonnements
      $subQueryNbAbo = "	SELECT IF(COUNT(*) > 0, COUNT(*), 1)
								FROM amap_abonnementadherent
								WHERE NomAbonnement = '".$abonnement['Nom']."'";
								
      // nombre total d'inscriptions en équipe de distribution (seulement adhérent abonné)
      $subQueryNbInsc = "	SELECT COUNT(*)
								FROM amap_distribution
								WHERE NomAbonnement = '".$abonnement['Nom']."'
								AND Statut = 'Inscrit'
								AND IDA IN(SELECT IDA FROM amap_abonnementadherent WHERE NomAbonnement = '".$abonnement['Nom']."')";
			
      // nombre moyen effectués par tous les adhérents
      $subQueryMoyNbInsc = "SELECT (".$subQueryNbInsc.")/(".$subQueryNbAbo.")";
			
      $query = "SELECT (".$subQueryNbInscAd."), (".$subQueryMoyNbInsc.")";
			
      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {exit( 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />');}
			
      $resultat = $database->loadRowList();
			
      $nbInscAd = $resultat[0][0];
      $moyNbInsc = $resultat[0][1];
    }
  }
	


  /////////////////////////// import de cette fonction de mod_amap
  //// renvoie la liste des prochaines distributions, tous abonnements confondus, limité aux 2 prochains
  function getprodistri() {
    global $mainframe;
    $database = &JFactory::getDBO();
    $data = NULL;
    $numAbo=0;
		
    $query = "	SELECT *, MIN(da.Date) as NextDate
			FROM amap_abonnement a, amap_jourdistributionabonnement da
			WHERE da.NomAbonnement = a.Nom
			AND (a.Statut = 'Ouvert' Or a.Statut = 'Complet' )
			AND da.date >= date(now())
			GROUP By a.Nom 
			ORDER By NextDate, a.Nom 
			";

    $database->setQuery($query);
    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
    if ($database->getNumRows() != 0) { 
      $abonnements = $database->loadAssocList('Nom'); 
    } else { echo "pas d'abonnement en cours"; return $data;}

    foreach ($abonnements as $abonnement) {
      //			echo 'abo : '.$abonnement['Nom'].'<br />'; 

      // détermination du nombre de dossiers en cours 
      $query = "	SELECT count(IDA) FROM amap_abonnementadherent 
				WHERE NomAbonnement = '".$abonnement['Nom']."' 
				AND Statut = 'Encours'";
      $database->setQuery($query);
      $database->query(); if ($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
      $encours = $database->loadResult(); 
			


      // début de la requête principale poour déterminer le nombre de panier à livrer et le nombre d'orphelin
      $query = "	SELECT DATE_FORMAT(amap_jourdistributionabonnement.Date, '%d/%m/%Y') as Date,";
      //			$query = "	SELECT amap_jourdistributionabonnement.Date,";

      //		$nbVariantes = count(listeVariantes());
      $nbVariantes = 5;
      $nbOptions = 10;

      // sous-requêtes comptant le nombre de paniers pour chaque variante
      if($nbVariantes > 0 && $abonnement['QteMax']>0){
	$subQuery = NULL;
	for($i = 0 ; $i < $nbVariantes ; $i++){
	  // compte le nombre de paniers reportés à une autre date
	  if ($abonnement['Variante'.($i+1)]) {
	    $reportsPourAutreDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
						FROM amap_abonnementadherent, amap_report
						WHERE amap_abonnementadherent.IDA = amap_report.IDA
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
						AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.DateInitial = amap_jourdistributionabonnement.Date
						AND amap_abonnementadherent.Statut = 'Abonne'";
						
	    // compte le nombre de panier reportés à cette date
	    $reportsPourCetteDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0)
						FROM amap_abonnementadherent, amap_report
						WHERE amap_abonnementadherent.IDA = amap_report.IDA
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
						AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.DateReport = amap_jourdistributionabonnement.Date
						AND amap_abonnementadherent.Statut = 'Abonne'";

	    $subQuery[$i] = "	SELECT IFNULL(SUM(amap_abonnementadherent.Quantite), 0) - (".$reportsPourAutreDate.") + (".$reportsPourCetteDate.")
					FROM amap_abonnementadherent
					WHERE amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
					AND amap_abonnementadherent.Variante = '".$abonnement['Variante'.($i+1)]."'
					AND amap_abonnementadherent.Statut = 'Abonne'
					AND amap_jourdistributionabonnement.Date <= amap_abonnementadherent.derniereDistribution
					AND amap_jourdistributionabonnement.Date >= amap_abonnementadherent.premiereDistribution";
	    //echo 'Variante'.($i+1).': '.$abonnement['Variante'.($i+1)].'<br />'; 
	  } 
	}
	foreach($subQuery as $cle => $valeur){
	  $query = $query.' ('.$valeur.') AS \''.$abonnement['Variante'.($cle+1)].'\',';
	}
      }

      // sous-requêtes comptant le nombre de paniers pour chaque options 

      if($nbOptions > 0 ){
	$subQuery = NULL;
	for($i = 0 ; $i < $nbOptions ; $i++){
	  // compte le nombre de paniers reportés à une autre date
	  if ($abonnement['Option'.($i+1)]) {
	    $reportsPourAutreDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.QuantiteOption".($i+1)."), 0)
						FROM amap_abonnementadherent, amap_report
						WHERE amap_abonnementadherent.IDA = amap_report.IDA
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.DateInitial = amap_jourdistributionabonnement.Date
						AND amap_abonnementadherent.Statut = 'Abonne'";
						
	    // compte le nombre de panier reportés à cette date
	    $reportsPourCetteDate = "	SELECT IFNULL(SUM(amap_abonnementadherent.QuantiteOption".($i+1)."), 0)
						FROM amap_abonnementadherent, amap_report
						WHERE amap_abonnementadherent.IDA = amap_report.IDA
						AND amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.NomAbonnement = '".$abonnement['Nom']."'
						AND amap_report.DateReport = amap_jourdistributionabonnement.Date
						AND amap_abonnementadherent.Statut = 'Abonne'";

	    $subQuery[$i] = "	SELECT IFNULL(SUM(amap_abonnementadherent.QuantiteOption".($i+1)."), 0) - (".$reportsPourAutreDate.") + (".$reportsPourCetteDate.")
				        FROM amap_abonnementadherent
					WHERE amap_abonnementadherent.NomAbonnement = '".$abonnement['Nom']."'
					AND amap_abonnementadherent.Statut = 'Abonne'
					AND amap_jourdistributionabonnement.Date <= amap_abonnementadherent.derniereDistribution
					AND amap_jourdistributionabonnement.Date >= amap_abonnementadherent.premiereDistribution";
	    //echo 'Variante'.($i+1).': '.$abonnement['Variante'.($i+1)].'<br />'; 
	    $query = $query.' ('.$subQuery[$i].') AS \''.$abonnement['Option'.($i+1)].'\',';
	  } 
	}

      }

      // sous-reqûete comptant le nombre de paniers orphelins
      $subQuery = "	SELECT COUNT(*)
				FROM amap_orphelin
				WHERE amap_orphelin.Date = amap_jourdistributionabonnement.Date
				AND IDAadoptant = 0
				AND Statut = 1
				AND amap_orphelin.NomAbonnement = '".$abonnement['Nom']."'";
      $query = $query.' ('.$subQuery.') AS \'Orphelins\'';

      // clause FROM et WHERE de la requête principale
      $query = $query."	FROM amap_jourdistributionabonnement
				WHERE amap_jourdistributionabonnement.NomAbonnement = '".$abonnement['Nom']."'
				AND amap_jourdistributionabonnement.date >= date(now())
				ORDER By amap_jourdistributionabonnement.date 
				LIMIT 4";								;
      // récupère toutes les distributions de l'abonnement en cours de traitement avec le nombre de panier pour chaque variante
      echo "\n<!--\n $query \n-->\n"; // pour voir la requète si nécessité de debug 

      $database->setQuery($query);
      $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}


      if($database->getNumRows() > 0){
	$data[$abonnement['Nom']] = array('abonnement'=>$abonnement,'distrib'=>$database->loadAssoc(),'encours'=>$encours);
      }
    }
    return $data;
  }
  //////////////////////////// fin import de mod_amap



  ///////////// fonctions pour gesstion de carte
  // from a string containing a direction, will return an array with lon and lat
  // not used for now since we use google maps service
  function addressToCoord($address)
  {
    $lon="";
    $lat="";
    $address = urlencode($address);
    $string = file_get_contents("http://nominatim.openstreetmap.org/search?q=$address&format=xml");
    $xml=simplexml_load_string($string);
    foreach($xml->place[0]->attributes() as $a => $b)
      {
	if ($a == "lat")  
	  $lat = (string)$b; 
	if ($a == "lon")  
	  $lon = (string)$b; 
      }
	  
    return (array($lon, $lat));
  }
	
  // retoure un tableau avec la liste des adhérents qui ont coché 
  //l'option "carte du voisinage", avec lon, lat, nom, adresse, téléphone
  function getVoisinageInfo()
  {
    global $mainframe;
    $database = &JFactory::getDBO();
    $data = Array();
		
    $query = "	SELECT Nom, Prenom, Email, Fixe, Mobile, Adresse, CP, Ville, lat, lon 
			FROM amap_adherent
			WHERE PublicationAdresse = '1'
			";

    $database->setQuery($query);
    $database->query(); if ($database->getErrorNum()) {echo 'Error ' . 
			    $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';} 
    if ($database->getNumRows() != 0) { 
      foreach($database->loadRowList() as $i)
	if ($i[8]!="" and $i[9]!="")
	  $data[] = Array("Nom"=>$i[0],
			  "Prenom"=>$i[1],
			  "Email"=>$i[2],
			  "Fixe"=>$i[3],
			  "Mobile"=>$i[4],
			  "Adresse"=>$i[5],
			  "CP"=>$i[6],
			  "Ville"=>$i[7],
			  "lat"=>$i[8],
			  "lon"=>$i[9]);
    }
    return $data;

  }






}
// ************************************ fonction d'affichage

// ************************************ formulaires ************************************
class formulaire {
  var $fields;
  var $task;
  var $view;
  var $titre;
  var $texte;
  var $submittext;
	
  function affiche() {
    //echo '<div class="componentheading">'.$this->titre.'</div>';
    if(isset($this->titre)){
      echo '<h3 class="amap_titre">'.$this->titre.'</h3>';
    }
    echo '<form id="actionForm" method="post" action="index.php?option=com_amap">';
    //echo '<table class="actionTable" align="center" border="0" cellpadding="0" cellspacing="2">';
    echo '<input type="hidden" name="option" value="com_amap">'; // pour retourner dans le composant
    echo '<input type="hidden" name="task" value="'.$this->task.'">'; // la tache à traiter
    if (isset($this->view)) { echo '<input type="hidden" name="view" value="'.$this->view.'">';} // la vue à afficher
		
    if(isset($this->texte) && $this->texte != ''){
      echo '<tr><p>'.$this->texte.'</p></tr>';
    }

    // initialisation, on considère que le tableau de mise en forme n'a pas été ouvert et qu'il n'y a pas de fieldset
    $table = FALSE;
    $fieldset = FALSE;

    foreach ($this->fields as $field) { // affichage des champs
		
      $value = ""; // Valeur par défaut
      if(isset($field['value'])){
	$value = $field['value'];
      }
			
      // groupement de champs
      // le tableau qui met en forme le formulaire doit être à l'intérieur du fieldset pour un affichage correct
      if($field['type'] == 'fieldset'){
	// s'il y a déjà un tableau de commencé alors on le ferme
	if($table){
	  echo '</table>';
	  $table = FALSE;
	}
	echo '<fieldset class="amap_fieldset">';
	echo '<legend>'.$field['legend'].'</legend>';
	$endfield = $field['endfield'];
	echo '<table border="0" cellpadding="0" cellspacing="2">';
	$fieldset = TRUE;
      }
			
      // s'il n'y a pas de fieldset alors on utilise quand même un tableau
      if(!$fieldset && !$table){
	echo '<table border="0" cellpadding="0" cellspacing="2">';
	$table = TRUE;
      }

      if($field['type'] == 'hidden'){
	// champ invisible
	echo '<input type="hidden" name="'.$field['name'].'" value="'.$value.'">';
      } else {
	// message d'erreur
				
	if(isset($field['libelle'])){
	  echo '<tr><td align="left" title="'.$field['libelle'].' : ">';
					
	  if($field['type'] != 'checkbox'){
	    echo '<nobr>'.$field['libelle'].' </nobr>';
	  }
	  echo '</td>';
	}
	echo '<td>';
	// champ de texte
	if ($field['type'] == 'text'){
	  echo '<input';
	  if(isset($field['errmsg'])){
	    echo ' class="amap_erreur"';
	  }
	  echo ' type="text" name="'.$field['name'].'" size="'.$field['size'].'" value="'.$value.'">';
	  /*
	    if(isset($field['obli']) && $field['obli']){ 
	    echo ' *';
	    }*/
	}
				

				
	// champ de texte multiligne
	if($field['type'] == 'textarea'){
	  echo '<textarea name="'.$field['name'].'" rows="'.$field['rows'].'" cols="'.$field['cols'].'">'.$value.'</TEXTAREA>';
	}
	// liste déroulante
	if($field['type'] == 'select'){
	  echo '<select name="'.$field['name'].'" size="'.$field['size'].'">';
	  // options du menu déroulant
	  foreach($field['options'] as $option){
	    if(isset($field['disabled']) && in_array($option, $field['disabled'])){
	      /* WORKAROUND POUR IE : au lieu d'utiliser l'attribut disabled dans un option,
		 on utilise un optgroup vide afin d'empêcher la sélection de l'item
	      */
	      if(dateValide($option)){
		echo '<optgroup label="'.fdate($option).'"></optgroup>';
	      } else {
		echo '<optgroup label="'.$option.'"></optgroup>';
	      }
	    } else {
	      echo '<option value="'.$option.'" ';
	      // choix sélectionné
	      if($field['value'] == $option){
		echo "selected=selected ";
	      }
							
	      if(dateValide($option)){
		echo'>'.fdate($option).'</option>';
	      } else {
		echo'>'.$option.'</option>';
	      }
	    }
	  }
	  echo '</select>';
	}

	// case à cocher
	if($field['type'] == 'checkbox'){
	  echo '<input type="checkbox" name="'.$field['name'].'" value=1 ';
	  // coché ou non par défaut
	  if($field['value'] == 1){
	    echo "checked=checked";
	  }
	  echo '>'.$field['libelle'];
	}
				
	if (isset($field['errmsg'])){
	  echo '<nobr><em class="amap_small">'.$field['errmsg'].'</em></nobr>';
	}

	echo '</td>';

	// si un fieldset doit être fermé
	if(isset($endfield) && isset($field['name'])) {
	  if($field['name'] == $endfield){
	    echo '</table>';
	    echo '</fieldset>';
	    $fieldset = FALSE; // fin du fieldset
	  }
	}			
				
      }
    }
    // si une table n'a pas encore été fermé
    if($table){
      echo '</table>';
    }
    echo '<table><tr><td align="center" colspan="2" >';
    echo '<button type="submit" alt="'.$this->submittext.'" title="'.$this->submittext.'">'.$this->submittext.'</button>';
    echo '</td></table>';		
    echo '</form>';
  }

  function getval($name){
    return $this->fields[$name]['value'];
  }
}

//  renvoie le tableau des variantes de l'abonnement en cours de traitement
function listeVariantes() {
  global $mainframe;
	
  $abonnement = $mainframe->getUserState("amap_abonnement");

  $listeVariantes = NULL;
  for($i = 0 ; $i < 10 ; $i++){
    if($abonnement['Variante'.($i+1)] != NULL && $abonnement['Variante'.($i+1)] != ''){
      $listeVariantes[$i] = $abonnement['Variante'.($i+1)];
    }
  }

  return $listeVariantes;
}

//  renvoie le tableau des options de l'abonnement en cours de traitement
function listeOptions() {
  global $mainframe;
	
  $abonnement = $mainframe->getUserState("amap_abonnement", NULL);

  $listeOptions = NULL;
  for($i = 0 ; $i < 10 ; $i++){
    if($abonnement['Option'.($i+1)] != NULL && $abonnement['Option'.($i+1)] != ''){
      $listeOptions[$i] = $abonnement['Option'.($i+1)];
    }
  }
		
  return $listeOptions;
}

//  renvoie le tableau des quantités maximum pour chaque options de l'abonnement en cours de traitement
function qteMaxOptions() {
  global $mainframe;
		
  $abonnement = $mainframe->getUserState("amap_abonnement");

  $qteMaxOptions = NULL;
  for($i = 0 ; $i < 10 ; $i++){
    $qteMaxOptions[$i] = $abonnement['QteMaxOption'.($i+1)];
  }
			
  return $qteMaxOptions;
}

// renvoie la description de l'abonnement en cours de traitement
function descriptionAbonnement(){
  global $mainframe;
  $abonnement = $mainframe->getUserState("amap_abonnement");			
				
  $texte = '	<table class="amap_encadre">
					<tr align="center">
						<th>Produit</th>
						<th>Société</th>
						<th>Distribution</th>
						<th>Lieu</th>
					</tr>
					<tr align="center">
						<td>'.$abonnement['Produit'].'</td>
						<td>'.$abonnement['Societe'].'</td>
						<td>'.$abonnement['Periodicite'].'</td>
						<td>'.$abonnement['Lieu'].'</td>
					</tr>
				</table>';

  return $texte;
}

// renvoie les renseignement sur l'état des abonnements
function etatAbonnements(){
  global $mainframe;
  $abonnement = $mainframe->getUserState("amap_abonnement");
	
  $database = &JFactory::getDBO();
	
  $query = "SELECT 	(SELECT COUNT(*) FROM amap_abonnementadherent WHERE Statut = 'Abonne' AND NomAbonnement = '".$abonnement['Nom']."') AS 'Abonnes',
						(SELECT COUNT(*) FROM amap_abonnementadherent WHERE Statut = 'Encours' AND NomAbonnement = '".$abonnement['Nom']."') AS 'EnAttente',
						(SELECT COUNT(*) FROM amap_abonnementadherent WHERE Statut = 'Liste' AND NomAbonnement = '".$abonnement['Nom']."') AS 'SurListe'";
						
  $database->setQuery($query);
  $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
	
  $Abonnes = 0;
  $EnAttente = 0;
  $SurListe = 0;
	
  if($database->getNumRows() > 0){
    $resultat = $database->loadAssocList();

    $Abonnes = $resultat[0]['Abonnes'];
    $EnAttente = $resultat[0]['EnAttente'];
    $SurListe = $resultat[0]['SurListe'];
    $Total = $Abonnes + $EnAttente + $SurListe;
  }
	
  $query = "	SELECT *
				FROM amap_jourdistributionabonnement
				WHERE NomAbonnement = '".$abonnement['Nom']."'
				ORDER BY Date ASC";
				
  $database->setQuery($query);
  $database->query(); if($database->getErrorNum()) {echo 'Error ' . $database->getErrorNum() . ': ' . $database->getErrorMsg().'<br />';}
	
  $nbDistribRestantes = 0;
  $prochaineDistrib = NULL;
  if($database->getNumRows() > 0){
    $resultat = $database->loadAssocList();
		
    $date = date("Y-m-d");
    foreach($resultat as $cle => $row){
      if($nbDistribRestantes > 0){
	$nbDistribRestantes++;
      }
      if($nbDistribRestantes == 0 && $row['Date'] > $date){
	$prochaineDistrib = $row['Date'];
	$nbDistribRestantes++;
      }
    }
  }
	
  $texte = '	<table class="amap_encadre">
					<tr>
						<td>
							<p>';
  if($abonnement['NombreMinAdherent'] != NULL || $abonnement['NombreMaxAdherent'] != NULL){
    if($abonnement['NombreMinAdherent'] != NULL && $abonnement['NombreMaxAdherent'] != NULL){
      $texte .= 'L\'agriculteur a précisé qu\'il fallait <strong>entre '.$abonnement['NombreMinAdherent'].' et '.$abonnement['NombreMaxAdherent'].' abonnés</strong> aux distributions.';
    } else {
      if($abonnement['NombreMinAdherent'] != NULL){
	$texte .= 'L\'agriculteur a précisé qu\'il fallait <strong>au minimum '.$abonnement['NombreMinAdherent'].' abonnés</strong> pour effectuer les distributions.';
      }
      if($abonnement['NombreMaxAdherent'] != NULL){
	$texte .= 'L\'agriculteur a précisé qu\'il <strong>ne pouvait pas y avoir plus de '.$abonnement['NombreMinAdherent'].' abonnés</strong> aux distributions.';
      }
    }
  }
  $texte .=				' A ce jour il y a <strong>'.$Total.'</strong> demande(s) d\'abonnement dont <strong>'.$Abonnes.'</strong> validé(s), <strong>'.$SurListe.'</strong> sur liste d\'attente  et <strong>'.$EnAttente.'</strong> en attente de validation.
							</p>
							<p>
							Il reste <strong>'.$nbDistribRestantes.'</strong> distribution(s) pour cet abonnement. La prochaine est le <strong>'.fdate($prochaineDistrib).'</strong>.
							</p>
						</td>
					</tr>
				</table>';

  return $texte;
}


// ************************************ tableaux ************************************
function afficheHeader() {
  //	echo '</td></tr></table>';
}

function afficheFooter() {
  //	echo '<table class="nopad"><tr valign="top"><td>';
}

class tableau {

  var $header; 			// tableau contenant l'en-tête du tableau
  var $table;				// données (cellules) du tableau
  var $colCaches;			// colonne qui ne doivent pas apparaitre
  var $commandes;			// tableau des commandes (boutons dans la dernière colonne)
	
  var $idtab;				// identifiant pour distinguer chaque tableau (utile lors des tris)

  var $critereTri;		// sur quelle colonne s'effectue le critère de tri ?
  var $ordreTri;			// ordre de tri type SQL (ASC/DESC)
	
  var $url;				// sur quel url se trouve le tableau

  var $surlignage;		// permet de mettre en valeur une ligne qui contient une valeur indiqué
	
  function afficheTable() {
			
    print "<table class='amap_tableau'>\n";
	
    //affichage du titre (la première ligne)
    print "<tr style='text-align:center; background-color:crimson; font-weight:bold;' width='100%'>\n";
	
    foreach($this->header as $cle => $headerCell) {
      // est-ce que le tableau est trié ?
      if(isset($this->critereTri) && isset($this->ordreTri)){
	print "<th class='amap_header'>";
	print '<a class="amap_headerLink" href="'.$this->url.'&amp;idtab='.$this->idtab.'&amp;critere='.($cle+1).'&amp;ordre='.(($this->ordreTri == 'asc')? 'desc' : 'asc').'">';
	print '<p>'.$headerCell.'</p>';
	if(($cle + 1) == $this->critereTri){
	  print '<img src="components/com_amap/images/'.$this->ordreTri.'.png" />';
	}
	print '</a>';
	print "</th>\n";

	// sinon afficher sans possibilité de tri
      } else {
	print '<th class="amap_header">'.$headerCell.'</th>';
      }
    }
    // affiche ou non la cellule vide de la colonne commande
    if(isset($this->commandes)){
      print '<td></td>';
    }
    print '</tr>';
	  
    // affichage du tableau
    $parite=0;
    foreach($this->table as $row) {
      // affichage de la ligne 
      if ($parite == 0) {
	print "<tr style='text-align:center; background-color:navajowhite;";
	$parite = 1;
      } else {
	print "<tr style='text-align:center; background-color:papayawhip;";
	$parite = 0;
      }
	    
      // est-ce qu'on doit mettre en valeur la ligne actuelle ?
      if(isset($this->surlignage) && $this->surlignage != NULL){
	if(in_array($this->surlignage, $row)){
	  //print 'border:solid 1px crimson;';
	  print 'background-color:#F4FF66;';
	}
      }

      // fin du tr
      print "'>\n";
			
      $i = 0;
      // affichage de chaque cellule
      foreach($row as $cell) {
	if(dateValide($cell)){
	  print "<td>".fdate($cell)."</td>\n";
	} else {
	  print "<td>".$cell."</td>\n";
	}
	$i++;
      }
			
      if(isset($this->commandes)){
	// affichage des boutons à la fin de la ligne
	print "<td align='right' valign='middle'>\n";
	foreach ($this->commandes as $commande){
					
	  print '<a href="'.$commande['href'];
	  // liste des paramètres
	  if(isset($commande['param'])){
	    foreach($commande['param'] as $cle => $valeur){
	      print '&amp;'.$cle.'='.$row[$valeur];
	    }
	  }
	  print '">'; # fin du <a>
			// icone ou texte
			if(isset($commande['icone'])){
			  if(isset($commande['title'])){
			    $title = $commande['title'];
			  } else {
			    $title = 'Préférences';
			  }
			  print '  <img width="16" height="16" border="0" title="'.$title.'" src="components/com_amap/images/'.$commande['icone'].'" >';
			} elseif(isset($commande['texte'])){
	    print $commande['texte'];
	  }
	  print '	</a>';
	}
	print "</td>\n";
	print "</tr>\n";
      }
    }
    print "</table>\n";
  }
}

// ************************************ général ************************************
// définit un message utilisant la classe JApplication de Joomla
function message($message, $type = 'message'){
  $app = &JFactory::getApplication();
  $app->enqueueMessage($message, $type);
}

// envoie un email
function envoyerCourriel($destinataire, $sujet, $message) {
  // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
  $entete  = 'MIME-Version: 1.0' . "\r\n";
  $entete .= 'Content-type: text/html; charset=iso-8859-1' . "\n";

  $sujet = mb_encode_mimeheader('[AMAP] '.$sujet);
	
  $message = '<html>
					<body style="font-family:Arial;">
						<p>'
    .$message.'<br />----------<br />Ceci est un message automatique, n\'y répondez pas.
						</p>
					</body>
				</html>';
				
  $message = utf8_decode($message);
	
  return mail($destinataire, $sujet, $message, $entete);
}

// retourne un tableau sans l'élément e du tableau tab
function supprElement($tab, $e){
  foreach($tab as $cle => $val){
    if($val != $e){$res[$cle] = $tab[$cle];}
  }
  return $res;
}

// fonction qui retourne un tableau associatif contenant chaque élément d'une date au format suivant :
// aa-mm-jj hh-mm-ss
function analyseDate($date){

  $len = strlen($date);
  $tableau = array('année', 'mois', 'jour', 'heure', 'minute', 'seconde');

  $i = 0;
  foreach($tableau as $type){
    $tampon = NULL;
    $j = 0;
    while($i < $len && $date[$i] != '-' && $date[$i] != ':' && $date[$i] != ' '){
      $tampon[$j] = $date[$i];
      $i++;
      $j++;
    }
    $i++;

    $resultat[$type] = implode($tampon);
  }
  return $resultat;
}

// remplace fputcsv
function ecritLigneCSV($handle, $row, $sep){
  $nbCellules = count($row);
	
  $i = 0;
  foreach($row as $valeur){
    $valeur = utf8_decode($valeur);
	
    if(is_string($row[$i])){
      fwrite($handle, '"'.$valeur.'"');
    } else {
      fwrite($handle, $valeur);
    }
		
    if($i < $nbCellules - 1){
      fwrite($handle, $sep);
    }
    $i++;
  }
  fwrite($handle, "\n");
}

// créer un fichier CSV avec l'extension XLS
function exportExcel($donnees){
  $handle = fopen('components/com_amap/export.xls', 'w');

  if(is_writable('components/com_amap/export.xls')){
    foreach($donnees as $row){
      ecritLigneCSV($handle, $row, chr(9));
    }
    fclose($handle);

    header('Content-Description: File Transfer');
    header('Content-Type: plain/text; charset=utf-8');
    header("Content-Disposition: attachment; filename=export.xls");
    header('Content-Transfer-Encoding: binary');
    header("Expires: 0");
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize('components/com_amap/export.xls'));
    ob_clean();
    flush();
    readfile('components/com_amap/export.xls');
    exit();
  } else {
    message("Impossible de créer le fichier. Veuillez réessayer dans un moment.");
  }
}

// ecrit une page HTML pour le rapport
function exportHTML($donnees){
  echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
  echo '<html>';
  echo '<head>
				<title>Rapport de la distribution</title>
				<link rel="stylesheet" href="http://www.lemiam.org/components/com_amap/css/amap.css" type="text/css" />
			</head>
			<body>';
  echo '<table class="amap_rapport">';
	
  foreach($donnees as $row){
    echo '<tr>';
    foreach($row as $cell){
      if(!isset($flag)){
	echo '<th height>'.$cell.'</th>';
				
      } else {
	echo '<td height="38px">'.$cell.'</td>';
      }
    }
    $flag = TRUE;
    echo '</tr>';
  }
  echo '</table>';
  echo '</body></html>';
  exit();
}

// recopie un tableau
function copierTableau($arr){
  foreach($arr as $cle => $valeur){
    $res[$cle] = $valeur;
  }
  return $res;
}

// formate correctement une date
function fdate($date){
  return date("d/m/Y", strtotime($date));
}

// vérifie d'une date est valide
function dateValide($date){
  $valide = FALSE; // par défaut on supposes que la date n'est pas valide

  $arr = explode('-', $date, 3);
	
  if(count($arr) == 3){
    list($annee, $mois, $jour) = $arr;
		
    if(strlen($annee) == 4 && strlen($mois) == 2 && strlen($jour) == 2){
      if(!empty($annee) && !empty($mois) && !empty($jour)){
	if(checkdate($mois , $jour, $annee)){
	  $valide = TRUE;
	}
      }
    }
  }

  return $valide;
}
?>
